Subject: LT
Envivo Bio, Inc.; Confidential
Figure 1 is an interactive figure showing the microbial community
composition in each collected sample. Here, each color and shade
corresponds to a different genus. For reference, domestic dogs
(Canis familiaris) and gray wolves (Canis lupus) are
different species that belong to the same genus (Canis).
You can interact with this figure by:
- Hovering the cursor over a color in the stacked bar to see the
taxonomic identity, sample type, and relative abundance corresponding to
that color and bar
- Clicking and dragging the cursor over a portion of the figure to
zoom
- Single-clicking a genus’s name in the legend to remove that genus
from the figure
- Double-clicking (very quickly) a genus’s name in the legend
to only show that genus
Figure 1: Microbial community composition of
collected saliva and CapScan samples. CapScan samples are ordered from
proximal to distal intestine (i.e., increasing
distance from mouth). Taxonomic composition is reported at the genus
rank. Genera present at <1% relative abundance across all samples are
reported as “Other genera”. Note: Blue = Firmicutes;
Yellow = Actinomycetes; Green = Bacteroidetes; Red =
Proteobacteria; Purple = all other phyla. Shades of the same
color (except purple) correspond to different genera from the same
phylum.
Figure 2 is an interactive figure showing the microbial community
composition at higher taxononomic resolution. Here, each row corresponds
to a unique microbe.
You can interact with this figure by:
- Hovering the cursor over a cell to see that microbe’s genus and
species (and strain when available), relative abundance, and full
taxonomic classification
- Clicking and dragging the cursor over a portion of the figure to
zoom
Figure 2: Heat map showing relative abundance of
microbes in each sample (N = 292 total identified). Each row corresponds
to a unique microbe and each column corresponds to an individual sample.
Note the relative abundance colorscale is in log units.
1.3 Notable microbe detected
- Actinomyces naeslundii:
- Facilitates the initial colonization of tooth surfaces via biofilm
formation (Dige et al., 2009)
- Found in saliva (~0.9% relative abundance) and all 3 CapScan samples
(0.07% - 3% relative abundance)
1.4 References
Dige, I., Raarup, M.K., Nyengaard, J.R., Kilian, M., and Nyvad, B.
(2009) Actinomyces naeslundii in initial dental biofilm
formation. Microbiology 155: 2116–2126.
LS0tCnRpdGxlOiAiPGJyPiBUYXhvbm9taWMgcHJvZmlsaW5nIG9mIGJhY3RlcmlhbCBhbmQgYXJjaGFlYWwgY29tbXVuaXRpZXMgZnJvbSBzYWxpdmEgYW5kIENhcFNjYW4tc2FtcGxlZCBndXQgbWV0YWdlbm9tZXMiCm91dHB1dDoKICBodG1sX2RvY3VtZW50OgogICAgZGZfcHJpbnQ6IHBhZ2VkCiAgICB0b2M6IHRydWUKICAgIHRvY19mbG9hdDogdHJ1ZQogIGh0bWxfbm90ZWJvb2s6IGRlZmF1bHQKICBwZGZfZG9jdW1lbnQ6IGRlZmF1bHQKLS0tCgotLS0KCjxzdHlsZT4KZGl2LmhpZ2hsaWdodCB7CmJhY2tncm91bmQtY29sb3I6ICNGMkYyRjI7CnBhZGRpbmc6IDBweDsKYm9yZGVyLXJhZGl1czogMnB4Owp9Cgo8L3N0eWxlPgoKIyMjIDxiPjxpPlN1YmplY3Q6IExUPC9iPjwvaT4KKkVudml2byBCaW8sIEluYy47IENvbmZpZGVudGlhbCoKCmBgYHtyIHNldHVwLCBpbmNsdWRlID0gRkFMU0V9CmtuaXRyOjpvcHRzX2NodW5rJHNldChlY2hvID0gVFJVRSkKYGBgCgpgYGB7ciBhZGQgbG9nbywgZWNobyA9IEZBTFNFfQpsb2dvX3BhdGggPC0gIi4uL2xvZ28vZW52aXZvLnN2ZyIKCmh0bWx0b29sczo6aW1nKHNyYyA9IGtuaXRyOjppbWFnZV91cmkobG9nb19wYXRoKSwgCiAgICAgICAgICAgICAgIGFsdCA9ICJsb2dvIiwgCiAgICAgICAgICAgICAgIHN0eWxlID0gInBvc2l0aW9uOmFic29sdXRlOyB0b3A6MDsgcmlnaHQ6MDsgcGFkZGluZzoxMHB4OyB3aWR0aDogMTQ1cHg7IGhlaWdodDogNDJweCIpCmBgYAoKYGBge3IgbG9hZCBwYWNrYWdlcywgaW5jbHVkZSA9IEZBTFNFfQojIExpc3QgcmVxdWlyZWQgcGFja2FnZXMKY3JhblBhY2thZ2VzIDwtIGMoIkJpb2NNYW5hZ2VyIiwgImdncGxvdDIiLCAiZHBseXIiLCAidGlkeXIiLAogICAgICAgICAgICAgICAgICAiYXBlIiwgImdncGxvdDIiLCAicmVzaGFwZTIiLCAicGxvdGx5IiwgImhlYXRtYXBseSIpCmJpb2NQYWNrYWdlcyA8LSBjKCJwaHlsb3NlcSIsICJCaW9zdHJpbmdzIikKCiMgSW5zdGFsbCBtaXNzaW5nIENSQU4gcGFja2FnZXMKaW5zdGFsbGVkQ1JBTiA8LSBjcmFuUGFja2FnZXMgJWluJSByb3duYW1lcyhpbnN0YWxsZWQucGFja2FnZXMoKSkKaWYgKGFueShpbnN0YWxsZWRDUkFOID09IEZBTFNFKSkgewogIGluc3RhbGwucGFja2FnZXMoY3JhblBhY2thZ2VzWyFpbnN0YWxsZWRDUkFOXSwKICAgICAgICAgICAgICAgICAgIHJlcG9zID0gJ2h0dHA6Ly9jcmFuLnVzLnItcHJvamVjdC5vcmcnKQp9CgojIEluc3RhbGwgbWlzc2luZyBCaW9jb25kdWN0b3IgcGFja2FnZXMKaW5zdGFsbGVkQmlvYyA8LSBiaW9jUGFja2FnZXMgJWluJSByb3duYW1lcyhpbnN0YWxsZWQucGFja2FnZXMoKSkKaWYgKGFueShpbnN0YWxsZWRCaW9jID09IEZBTFNFKSkgewogIEJpb2NNYW5hZ2VyOjppbnN0YWxsKGJpb2NQYWNrYWdlc1shaW5zdGFsbGVkQmlvY10pCn0KCiMgTG9hZCBwYWNrYWdlcwpsYXBwbHkoYyhjcmFuUGFja2FnZXMsIGJpb2NQYWNrYWdlcyksIGxpYnJhcnksIGNoYXJhY3Rlci5vbmx5ID0gVFJVRSkKYGBgCgpgYGB7ciBsb2FkIGRhdGEsIGluY2x1ZGUgPSBGQUxTRX0KIyBMb2FkIENvc21vc0lEIGRhdGEgYW5kIGZvcm1hdHRlZCBtZXRhZGF0YQpjb3Ntb3MgPC0gcmVhZC5jc3YoZmlsZSA9ICIuLi9kYXRhL0NQMDQ2MThfZm9sbG93X3VwXzIwMjIwOTIwLmNzdiIpCm1ldGEgPC0gcmVhZC5jc3YoZmlsZSA9ICIuLi9kYXRhL0NQMDQ2MThfZm9sbG93X3VwX21ldGFkYXRhLmNzdiIpCmBgYAoKYGBge3IgZm9ybWF0IGRhdGEsIGluY2x1ZGUgPSBGQUxTRX0KIyBQcmVwYXJlIHRheF90YWJsZSBhbmQgb3R1X3RhYmxlIG9iamVjdHMKdGF4IDwtIGNvc21vcyAlPiUKICBzZWxlY3QoUGh5bHVtLCBDbGFzcywgT3JkZXIsIEZhbWlseSwgR2VudXMsIFNwZWNpZXMsIFN0cmFpbikgJT4lCiAgYXMubWF0cml4ICU+JQogIHRheF90YWJsZQoKc3RhcnRfaW5kIDwtIGdyZXAoIlN0cmFpbiIsIGNvbG5hbWVzKGNvc21vcykpKzEKc3RvcF9pbmQgPC0gbmNvbChjb3Ntb3MpLTIKYWJ1bmRhbmNlX3Njb3JlcyA8LSBjb3Ntb3NbLHN0YXJ0X2luZDpzdG9wX2luZF0gJT4lIG90dV90YWJsZSguLCB0YXhhX2FyZV9yb3dzID0gVFJVRSkKCiMgUmVmb3JtYXQgc2FtcGxlIG5hbWVzIGFuZCBtZXRhZGF0YSBzYW1wbGUgbmFtZXMgc28gdGhleSBtYXRjaApjb2xuYW1lcyhhYnVuZGFuY2Vfc2NvcmVzKSA8LSBjb2xuYW1lcyhhYnVuZGFuY2Vfc2NvcmVzKSAlPiUKICBnc3ViKCJYIiwgIiIsIC4pICU+JQogIGdzdWIoIl8uKiIsICIiLCAuKSAlPiUKICBwYXN0ZTAoIkVCXyIsIC4pCgpyb3cubmFtZXMobWV0YSkgPC0gbWV0YSAlPiUKICBwdWxsKFNhbXBsZV9udW1iZXIpICU+JQogIHBhc3RlMCgiRUJfIiwgLikKCnNhbV9kYXRhIDwtIHNhbXBsZV9kYXRhKG1ldGEpCmBgYAoKYGBge3IgYnVpbGQgcGh5bG9zZXEsIGluY2x1ZGUgPSBGQUxTRX0KIyBCdWlsZCBwaHlsb3NlcSBvYmplY3QKcHMgPC0gcGh5bG9zZXEodGF4LCBhYnVuZGFuY2Vfc2NvcmVzLCBzYW1fZGF0YSkKYGBgCgpgYGB7ciB0cmFuc2Zvcm0gZGF0YSwgaW5jbHVkZSA9IEZBTFNFfQojIExvZyB0cmFuc2Zvcm0KcHNMb2cgPC0gcHMgJT4lIHRyYW5zZm9ybV9zYW1wbGVfY291bnRzKC4sIGZ1bmN0aW9uKHgpIGxvZyh4ICsgMSwgYmFzZSA9IDEwKSkKCiMgUmVsYXRpdmUgYWJ1bmRhbmNlIHRyYW5zZm9ybQpwc1JBIDwtIHBzICU+JSB0cmFuc2Zvcm1fc2FtcGxlX2NvdW50cyguLCBmdW5jdGlvbih4KSB4L3N1bSh4KSoxMDApCmBgYAoKYGBge3IgcmFuayBwaHlsYSwgaW5jbHVkZSA9IEZBTFNFfQpwaHlfcmFuayA8LSBwc1JBICU+JQogIHRheF9nbG9tKC4sIHRheHJhbmsgPSAiUGh5bHVtIikgJT4lCiAgcHNtZWx0ICU+JQogIGdyb3VwX2J5KFBoeWx1bSkgJT4lCiAgc3VtbWFyaXNlKG1lZGlhbiA9IG1lZGlhbihBYnVuZGFuY2UpKQoKcGh5X3JhbmsgJT4lIGFycmFuZ2UoZGVzYyhtZWRpYW4pKQpgYGAKCmBgYHtyIHN1YmplY3Qgc3Vic2V0LCBpbmNsdWRlID0gRkFMU0V9CiMgU2V0IHN1YmplY3QKc3ViamVjdCA8LSAiTFQiCgojIFN1YnNldCB0byBzdWJqZWN0IHNhbXBsZXMgYW5kIGRyb3AgbWlzc2luZyB0YXhhCnBzU3ViIDwtIHN1YnNldF9zYW1wbGVzKHBzLCBTdWJqZWN0ID09IHN1YmplY3QpICU+JQogIHBydW5lX3RheGEodGF4YV9zdW1zKC4pID4gMCwgLikKCiMgQWRkIHBsb3QgbGFiZWwgZm9yIGVhY2ggc2FtcGxlCnNhbXBsZV9kYXRhKHBzU3ViKSRQbG90X2xhYmVsIDwtIHBhc3RlMChzYW1wbGVfbmFtZXMocHNTdWIpLCAiICgiLCBzYW1wbGVfZGF0YShwc1N1YikkU2FtcGxlX3R5cGUsICIpIikKCiMgUmVsYXRpdmUgYWJ1bmRhbmNlIHRyYW5zZm9ybQpwc1N1Yl9yYSA8LSBwc1N1YiAlPiUgdHJhbnNmb3JtX3NhbXBsZV9jb3VudHMoLiwgZnVuY3Rpb24oeCkgeC9zdW0oeCkqMTAwKQpgYGAKCmBgYHtyIHBsb3QgYmFyLCBpbmNsdWRlID0gRkFMU0V9CiMgRGVmaW5lIE5PVCBJTiBvcGVyYXRvcgonJSFpbiUnIDwtIGZ1bmN0aW9uKHgseSkhKCclaW4lJyh4LHkpKQoKIyBBZ2dsb21lcmF0ZSBhdCBHZW51cyBhbmQgbWVsdAp0YXhyYW5rIDwtICJHZW51cyIKbWVsdCA8LSBwc1N1Yl9yYSAlPiUgdGF4X2dsb20oLiwgdGF4cmFuayA9IHRheHJhbmspICU+JSBwc21lbHQKCiMgRGVmaW5lIG1ham9yIHBoeWxhCm1ham9yX3BoeSA8LSBjKCJGaXJtaWN1dGVzIiwgIkFjdGlub2JhY3RlcmlhIiwgIkJhY3Rlcm9pZGV0ZXMiLCAiUHJvdGVvYmFjdGVyaWEiKQoKIyBJZGVudGlmeSBnZW5lcmEgcHJlc2VudCBpbiA8MSUgcmVsYXRpdmUgYWJ1bmRhbmNlIGluIGFsbCBzYW1wbGVzCnJhcmVfZ2VuZXJhIDwtIG1lbHQgJT4lCiAgZ3JvdXBfYnkoU2FtcGxlX251bWJlciwgR2VudXMpICU+JQogIHN1bW1hcml6ZShzdW0gPSBzdW0oQWJ1bmRhbmNlKSkgJT4lCiAgdW5ncm91cCgpICU+JQogIGdyb3VwX2J5KEdlbnVzKSAlPiUKICBzdW1tYXJpemUobWF4ID0gbWF4KHN1bSkpICU+JQogIGZpbHRlcihtYXggPCAxKSAlPiUKICBwdWxsKEdlbnVzKQoKIyBDcmVhdGUgbmV3IGNvbHVtbiBjb250YWluaW5nIG5hbWUgb2YgZ2VudXMgaWYgYWJvdmUgY3V0b2ZmIG9yICJPdGhlciBnZW5lcmEiIGlmIG5vdApkZiA8LSBtZWx0ICU+JQogIG11dGF0ZShQaHlfZ3JvdXAgPSBjYXNlX3doZW4oUGh5bHVtICUhaW4lIG1ham9yX3BoeSB+ICJPdGhlciBwaHlsdW0iLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IFBoeWx1bSksCiAgICAgICAgIFBoeV9ncm91cCA9IGNhc2Vfd2hlbihHZW51cyAlaW4lIHJhcmVfZ2VuZXJhIH4gIk90aGVyIHBoeWx1bSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICBUUlVFIH4gUGh5X2dyb3VwKSwKICAgICAgICAgVGF4X2xhYmVsID0gY2FzZV93aGVuKEdlbnVzICVpbiUgcmFyZV9nZW5lcmEgfiAiQWFPdGhlciBnZW5lcmEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgVFJVRSB+IEdlbnVzKSkgJT4lCiAgZ3JvdXBfYnkoU3ViamVjdCkgJT4lCiAgYXJyYW5nZShTdWJqZWN0LCBTYW1wbGVfdHlwZSkKCiMgRGVmaW5lIG9yZGVyCnBoeV9vcmRlciA8LSBjKCJPdGhlciBwaHlsdW0iLAogICAgICAgICAgICAgICAiUHJvdGVvYmFjdGVyaWEiLAogICAgICAgICAgICAgICAiQmFjdGVyb2lkZXRlcyIsCiAgICAgICAgICAgICAgICJBY3Rpbm9iYWN0ZXJpYSIsCiAgICAgICAgICAgICAgICJGaXJtaWN1dGVzIikgJT4lIHJldgoKZ2VuX29yZGVyIDwtIGRmICU+JQogIHNlbGVjdChQaHlfZ3JvdXAsIFRheF9sYWJlbCkgJT4lCiAgbXV0YXRlKE9yZGVyID0gbWF0Y2goUGh5X2dyb3VwLCBwaHlfb3JkZXIpKSAlPiUKICBhcnJhbmdlKE9yZGVyLCBkZXNjKFRheF9sYWJlbCkpICU+JQogIGRpc3RpbmN0ICU+JQogIHB1bGwoVGF4X2xhYmVsKQoKZ2VuX29yZGVyIDwtIGZhY3Rvcihnc3ViKCJeQWEiLCAiIiwgZ2VuX29yZGVyKSwgbGV2ZWxzID0gZ3N1YigiXkFhIiwgIiIsIGdlbl9vcmRlcikpICMgdGhlIEFhIGlzIHRvIG1ha2Ugc3VyZSAiT3RoZXIiIGlzIHBsb3R0ZWQgYXQgdGhlIHRvcAoKZGYgPC0gZGYgJT4lCiAgbXV0YXRlKFRheF9sYWJlbCA9IGZhY3Rvcihnc3ViKCJeQWEiLCAiIiwgVGF4X2xhYmVsKSwgbGV2ZWxzID0gZ2VuX29yZGVyKSkKCiMgRGVmaW5lIHNhbXBsZSBvcmRlcgpkZiA8LSBkZiAlPiUKICBtdXRhdGUoUGxvdF9sYWJlbCA9IGZhY3RvcihkZiRQbG90X2xhYmVsLCBsZXZlbHMgPSBjKCJFQl8zODY4IChzYWxpdmEpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFQl8zODQ5IChDYXBTY2FuXyhTSSkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFQl8zODUwIChDYXBTY2FuXyhTSSkpIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJFQl8zODUxIChDYXBTY2FuXyhTSSkpIikpKQoKIyBEZWZpbmUgY29sb3JzCnBoeV9jb2xvciA8LSBkYXRhLmZyYW1lKFBoeWx1bSA9IGMoIkFjdGlub2JhY3RlcmlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiT3RoZXIgcGh5bHVtIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiQmFjdGVyb2lkZXRlcyIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpcm1pY3V0ZXMiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm90ZW9iYWN0ZXJpYSIpLAogICAgICAgICAgICAgICAgICAgICAgICBCYXNlX2NvbG9yID0gYygiI0ZGQjcyNCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjODMyQ0ZGIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIiM2NEM2MkEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAiIzA3MkFDOCIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICIjRTkzQjRGIikpCgpwaHlfY29sb3IgPC0gcGh5X2NvbG9yW21hdGNoKHBoeV9vcmRlciwgcGh5X2NvbG9yJFBoeWx1bSksXQoKIyBEYXRhIGZyYW1lIGFzIGlucHV0LCBkYXRhIGZyYW1lIHdpdGggbmV3IGNvbHVtbiBvZiBoZXggY29kZXMgYXMgb3V0cHV0CmNvbF9wYWxldHRlIDwtIGRmICU+JQogIHNlbGVjdChQaHlfZ3JvdXAsIFRheF9sYWJlbCkgJT4lCiAgZGlzdGluY3QgJT4lCiAgbXV0YXRlKEhleF9jb2RlID0gTkEpCgoKZm9yKHBoeSBpbiBwaHlfY29sb3IkUGh5bHVtKSB7CiAgdGVzdCA8LSBjb2xfcGFsZXR0ZSAlPiUKICAgIGZpbHRlcihQaHlfZ3JvdXAgPT0gcGh5KSAlPiUKICAgIHB1bGwoVGF4X2xhYmVsKSAlPiUKICAgIGRyb3BsZXZlbHMgJT4lCiAgICBsZXZlbHMKICAKICB0YXguY29sb3IgPC0gY29sb3JSYW1wUGFsZXR0ZShjKHBoeV9jb2xvciRCYXNlX2NvbG9yW21hdGNoKHBoeSwgcGh5X2NvbG9yJFBoeWx1bSldLCAid2hpdGUiKSkKICBjb2x0ZXN0IDwtIHRheC5jb2xvcihsZW5ndGgodGVzdCkrMikgJT4lCiAgICAuWy1sZW5ndGgoLildCiAgY29sX3BhbGV0dGUkSGV4X2NvZGVbbWF0Y2godGVzdCwgY29sX3BhbGV0dGUkVGF4X2xhYmVsKV0gPC0gY29sdGVzdAp9Cgpjb2xfcGFsZXR0ZSA8LSBjb2xfcGFsZXR0ZSAlPiUgYXJyYW5nZShmYWN0b3IoVGF4X2xhYmVsLCBsZXZlbHMgPSBnZW5fb3JkZXIpKQpgYGAKCjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+CiMjIyAxLjEgT3ZlcnZpZXcgb2YgbWljcm9iaWFsIGNvbW11bml0eSBjb21wb3NpdGlvbgo8L2Rpdj4KCkZpZ3VyZSAxIGlzIGFuIGludGVyYWN0aXZlIGZpZ3VyZSBzaG93aW5nIHRoZSBtaWNyb2JpYWwgY29tbXVuaXR5IGNvbXBvc2l0aW9uIGluIGVhY2ggY29sbGVjdGVkIHNhbXBsZS4gSGVyZSwgZWFjaCBjb2xvciBhbmQgc2hhZGUgY29ycmVzcG9uZHMgdG8gYSBkaWZmZXJlbnQgZ2VudXMuIEZvciByZWZlcmVuY2UsIGRvbWVzdGljIGRvZ3MgKCpDYW5pcyBmYW1pbGlhcmlzKikgYW5kIGdyYXkgd29sdmVzICgqQ2FuaXMgbHVwdXMqKSBhcmUgZGlmZmVyZW50IHNwZWNpZXMgdGhhdCBiZWxvbmcgdG8gdGhlIHNhbWUgZ2VudXMgKCpDYW5pcyopLgo8YnI+PGJyPgpZb3UgY2FuIGludGVyYWN0IHdpdGggdGhpcyBmaWd1cmUgYnk6CgoqIEhvdmVyaW5nIHRoZSBjdXJzb3Igb3ZlciBhIGNvbG9yIGluIHRoZSBzdGFja2VkIGJhciB0byBzZWUgdGhlIHRheG9ub21pYyBpZGVudGl0eSwgc2FtcGxlIHR5cGUsIGFuZCByZWxhdGl2ZSBhYnVuZGFuY2UgY29ycmVzcG9uZGluZyB0byB0aGF0IGNvbG9yIGFuZCBiYXIKKiBDbGlja2luZyBhbmQgZHJhZ2dpbmcgdGhlIGN1cnNvciBvdmVyIGEgcG9ydGlvbiBvZiB0aGUgZmlndXJlIHRvIHpvb20KKiBTaW5nbGUtY2xpY2tpbmcgYSBnZW51cydzIG5hbWUgaW4gdGhlIGxlZ2VuZCB0byByZW1vdmUgdGhhdCBnZW51cyBmcm9tIHRoZSBmaWd1cmUKKiBEb3VibGUtY2xpY2tpbmcgKDx1PnZlcnkgcXVpY2tseTwvdT4pIGEgZ2VudXMncyBuYW1lIGluIHRoZSBsZWdlbmQgdG8gb25seSBzaG93IHRoYXQgZ2VudXMKYGBge3IsIG91dC53aWR0aCA9ICIxMDAlIiwgZWNobyA9IEZBTFNFfQojIFBsb3QKcEJhciA8LSBwbG90X2x5KGRmLCB4ID0gflBsb3RfbGFiZWwsIHkgPSB+QWJ1bmRhbmNlLCB0eXBlID0gImJhciIsCiAgICAgICAgICAgICBjb2xvciA9IH5UYXhfbGFiZWwsIGNvbG9ycyA9IGNvbF9wYWxldHRlJEhleF9jb2RlLAogICAgICAgICAgICAgdGV4dHBvc2l0aW9uID0gIm5vbmUiLAogICAgICAgICAgICAgdGV4dCA9IH5wYXN0ZSgiPGI+R2VudXM6PC9iPiIsIFRheF9sYWJlbCwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj48YnI+IiwgIjxiPlNhbXBsZSB0eXBlOjwvYj4iLCBTYW1wbGVfdHlwZSwKICAgICAgICAgICAgICAgICAgICAgICAgICAgIjxicj4iLCAiPGI+UmVsYXRpdmUgYWJ1bmRhbmNlOjwvYj4iLCBwYXN0ZTAocm91bmQoQWJ1bmRhbmNlLCBkaWdpdHMgPSAxKSwgIiUiKSksCiAgICAgICAgICAgICBob3ZlcmluZm8gPSAidGV4dCIpICU+JQogIGxheW91dCh4YXhpcyA9IGxpc3QodGl0bGUgPSAiPGI+U2FtcGxlPC9iPiIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9ICJvdXRzaWRlIiksCiAgICAgICAgIHlheGlzID0gbGlzdCh0aXRsZSA9ICI8Yj5SZWxhdGl2ZSBhYnVuZGFuY2UgKCUpPC9iPiIsCiAgICAgICAgICAgICAgICAgICAgICB0aWNrcyA9ICJvdXRzaWRlIiksCiAgICAgICAgIGJhcm1vZGUgPSAic3RhY2siLAogICAgICAgICBmb250ID0gbGlzdChmYW1pbHkgPSAiQXJpYWwiKSkKCnBCYXIkeCRsYXlvdXQkeWF4aXMkbGluZWNvbG9yIDwtICIjMDAwMDAwIgpwQmFyCmBgYAoqKkZpZ3VyZSAxOioqIE1pY3JvYmlhbCBjb21tdW5pdHkgY29tcG9zaXRpb24gb2YgY29sbGVjdGVkIHNhbGl2YSBhbmQgQ2FwU2NhbiBzYW1wbGVzLiBDYXBTY2FuIHNhbXBsZXMgYXJlIG9yZGVyZWQgZnJvbSBwcm94aW1hbCB0byBkaXN0YWwgaW50ZXN0aW5lICgqaSouKmUqLiwgaW5jcmVhc2luZyBkaXN0YW5jZSBmcm9tIG1vdXRoKS4gVGF4b25vbWljIGNvbXBvc2l0aW9uIGlzIHJlcG9ydGVkIGF0IHRoZSBnZW51cyByYW5rLiBHZW5lcmEgcHJlc2VudCBhdCA8MSUgcmVsYXRpdmUgYWJ1bmRhbmNlIGFjcm9zcyBhbGwgc2FtcGxlcyBhcmUgcmVwb3J0ZWQgYXMgIk90aGVyIGdlbmVyYSIuIDx1Pk5vdGU6PC91PiBCbHVlID0gKkZpcm1pY3V0ZXMqOyBZZWxsb3cgPSAqQWN0aW5vbXljZXRlcyo7IEdyZWVuID0gKkJhY3Rlcm9pZGV0ZXMqOyBSZWQgPSAqUHJvdGVvYmFjdGVyaWEqOyBQdXJwbGUgPSBhbGwgb3RoZXIgcGh5bGEuIFNoYWRlcyBvZiB0aGUgc2FtZSBjb2xvciAoZXhjZXB0IHB1cnBsZSkgY29ycmVzcG9uZCB0byBkaWZmZXJlbnQgZ2VuZXJhIGZyb20gdGhlIHNhbWUgcGh5bHVtLgoKYGBge3IsIGluY2x1ZGUgPSBGQUxTRX0KIyBPcmRpbmF0aW9uLWJhc2VkCnBIZWF0X29yZCA8LSBwbG90X2hlYXRtYXAocHNTdWJfcmEsIG1ldGhvZCA9ICJOTURTIiwgZGlzdGFuY2UgPSAiYnJheSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgdGF4YS5sYWJlbCA9ICJTdHJhaW4iLAogICAgICAgICAgICAgICAgICAgICAgICAgIG1heC5sYWJlbCA9IDMwMCkKCiMgUmV0cmlldmUgcm93IGFuZCB0YXhvbiBvcmRlcnMKcm93X29yZGVyIDwtIHBIZWF0X29yZCRwbG90X2VudiR0YXhhLm9yZGVyICU+JSByZXYKdGF4X29yZGVyIDwtIHRheF90YWJsZShwc1N1Yl9yYSlbbWF0Y2gocm93X29yZGVyLCByb3duYW1lcyh0YXhfdGFibGUocHNTdWJfcmEpKSksXSAlPiUKICBhcy5kYXRhLmZyYW1lICU+JQogIG11dGF0ZSh0YXhvbiA9IHJvd25hbWVzKC4pLAogICAgICAgICBBYnVuZGFuY2UgPSAxLAogICAgICAgICBTYW1wbGUgPSBzdWJqZWN0KQoKIyBTZXQgY29sdW1uIG9yZGVyCmNvbF9vcmRlciA8LSBjKCJFQl8zODY4IChzYWxpdmEpIiwgIkVCXzM4NDkgKENhcFNjYW5fKFNJKSkiLCAiRUJfMzg1MCAoQ2FwU2Nhbl8oU0kpKSIsICJFQl8zODUxIChDYXBTY2FuXyhTSSkpIiwKICAgICAgICAgICAgICAgIlBoeWx1bSIsICJDbGFzcyIsICJPcmRlciIsICJGYW1pbHkiLCAiR2VudXMiLCAiU3BlY2llcyIsICJTdHJhaW4iKQpgYGAKCmBgYHtyLCBpbmNsdWRlID0gRkFMU0V9CiMgUHJlcGFyZSBkYXRhCnggPC0gcHNTdWJfcmEgJT4lIG90dV90YWJsZSAlPiUgYXMuZGF0YS5mcmFtZQpjb2xuYW1lcyh4KSA8LSBsYXBwbHkoY29sbmFtZXMoeCksIGdyZXAsIHNhbXBsZV9kYXRhKHBzU3ViX3JhKSRQbG90X2xhYmVsLCB2YWx1ZSA9IFRSVUUpICU+JSB1bmxpc3QKCiMgQWRkIHRheG9ub215CnggPC0gY2JpbmQoeCwgdGF4X3RhYmxlKHBzU3ViX3JhKSkKCiMgUmVvcmRlciByb3dzIGFuZCBjb2x1bW5zIHRvIG1hdGNoIG9yZGluYXRpb24KeCA8LSB4W21hdGNoKHJvd19vcmRlciwgcm93bmFtZXMoeCkpLCBtYXRjaChjb2xfb3JkZXIsIGNvbG5hbWVzKHgpKV0KCiMgU2V0IGhvdmVydGV4dApuc2FtcCA8LSBuc2FtcGxlcyhwc1N1Yl9yYSkKaG92ZXJfc3RyYWluIDwtIHhbLCAxOm5zYW1wXQpob3Zlcl9zdHJhaW5bXSA8LSBwYXN0ZTAoIjxiPk1pY3JvYmU6PC9iPiAiLCB4JFN0cmFpbiwgIlxuIiwKICAgICAgICAgICAgICAgICAgICAgICAgICI8Yj5SZWxhdGl2ZSBhYnVuZGFuY2U6PC9iPiAiKQpob3Zlcl9zdHJhaW4gPC0gYXMubWF0cml4KGhvdmVyX3N0cmFpbikKCmhvdmVyX2FidW5kIDwtIHhbLCAxOm5zYW1wXSAlPiUgcm91bmQoLiwgZGlnaXRzID0gMikgJT4lIGFzLmRhdGEuZnJhbWUKaG92ZXJfYWJ1bmQgPC0gYXBwbHkoaG92ZXJfYWJ1bmQsIDIsIHBhc3RlMCwgIiUiKQpob3Zlcl9hYnVuZCA8LSBhcy5tYXRyaXgoaG92ZXJfYWJ1bmQpCgpob3Zlcl90YXggPC0geFssIDE6bnNhbXBdCmhvdmVyX3RheFtdIDwtIHBhc3RlMCgiXG4gXG48Yj5QaHlsdW06PC9iPiAiLCB4JFBoeWx1bSwgIlxuIiwKICAgICAgICAgICAgICAgICAgICI8Yj5DbGFzczo8L2I+ICIsIHgkQ2xhc3MsICJcbiIsCiAgICAgICAgICAgICAgICAgICAiPGI+T3JkZXI6PC9iPiAiLCB4JE9yZGVyLCAiXG4iLAogICAgICAgICAgICAgICAgICAgIjxiPkZhbWlseTo8L2I+ICIsIHgkRmFtaWx5LCAiXG4iLAogICAgICAgICAgICAgICAgICAgIjxiPkdlbnVzOjwvYj4gIiwgeCRHZW51cywgIlxuIikKaG92ZXJfdGF4IDwtIGFzLm1hdHJpeChob3Zlcl90YXgpCgpob3ZlcnRleHQgPC0gbWF0cml4KHBhc3RlMChob3Zlcl9zdHJhaW4sIGhvdmVyX2FidW5kLCBob3Zlcl90YXgpLAogICAgICAgICAgICAgICAgbnJvdyA9IG5yb3coaG92ZXJfdGF4KSwgbmNvbCA9IG5jb2woaG92ZXJfdGF4KSkKCiMgUGVyZm9ybSBsb2cxMCB0cmFuc2Zvcm1hdGlvbiBvbiByZWxhdGl2ZSBhYnVuZGFuY2VzCmRhdGEgPC0gbG9nKHhbLCAxOm5zYW1wXSwgYmFzZSA9IDEwKQpkYXRhW3NhcHBseShkYXRhLCBpcy5pbmZpbml0ZSldIDwtIE5BCmBgYAo8YnI+PGJyPgoKPGRpdiBjbGFzcz0iaGlnaGxpZ2h0Ij4KIyMjIDEuMiBIaWdoLXJlc29sdXRpb24gc25hcHNob3Qgb2YgY29tbXVuaXR5IGNvbXBvc2l0aW9uCjwvZGl2PgpGaWd1cmUgMiBpcyBhbiBpbnRlcmFjdGl2ZSBmaWd1cmUgc2hvd2luZyB0aGUgbWljcm9iaWFsIGNvbW11bml0eSBjb21wb3NpdGlvbiBhdCBoaWdoZXIgdGF4b25vbm9taWMgcmVzb2x1dGlvbi4gSGVyZSwgZWFjaCByb3cgY29ycmVzcG9uZHMgdG8gYSB1bmlxdWUgbWljcm9iZS4KPGJyPjxicj4KWW91IGNhbiBpbnRlcmFjdCB3aXRoIHRoaXMgZmlndXJlIGJ5OgoKKiBIb3ZlcmluZyB0aGUgY3Vyc29yIG92ZXIgYSBjZWxsIHRvIHNlZSB0aGF0IG1pY3JvYmUncyBnZW51cyBhbmQgc3BlY2llcyAoYW5kIHN0cmFpbiB3aGVuIGF2YWlsYWJsZSksIHJlbGF0aXZlIGFidW5kYW5jZSwgYW5kIGZ1bGwgdGF4b25vbWljIGNsYXNzaWZpY2F0aW9uCiogQ2xpY2tpbmcgYW5kIGRyYWdnaW5nIHRoZSBjdXJzb3Igb3ZlciBhIHBvcnRpb24gb2YgdGhlIGZpZ3VyZSB0byB6b29tCgo8YnI+PGJyPgpgYGB7ciwgb3V0LmhlaWdodCA9ICI3NTBweCIsIGVjaG8gPSBGQUxTRX0KIyBQcmVwYXJlIHRheG9ub215IHJvdyBzaWRlCnJvd19zaWRlIDwtIHggJT4lIHNlbGVjdChQaHlsdW0pCnJvd19zaWRlJFBoeWx1bVtyb3dfc2lkZSRQaHlsdW0gJSFpbiUgbWFqb3JfcGh5XSA8LSAiT3RoZXIgcGh5bGEiCnJvd19zaWRlJFBoeWx1bSA8LSBmYWN0b3Iocm93X3NpZGUkUGh5bHVtLCBsZXZlbHMgPSBjKCJPdGhlciBwaHlsYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJQcm90ZW9iYWN0ZXJpYSIsCiAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJCYWN0ZXJvaWRldGVzIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkFjdGlub2JhY3RlcmlhIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpcm1pY3V0ZXMiKSkKCiMgUGxvdApwSGVhdCA8LSBoZWF0bWFwbHkoZGF0YSwKICAgICAgICAgICAgICAgICAgIFJvd3YgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIENvbHYgPSBGQUxTRSwKICAgICAgICAgICAgICAgICAgIGNvbG9ycyA9IHZpcmlkaXM6OnZpcmlkaXMoMTApLAogICAgICAgICAgICAgICAgICAgcm93X3NpZGVfY29sb3JzID0gcm93X3NpZGUsCiAgICAgICAgICAgICAgICAgICByb3dfc2lkZV9wYWxldHRlID0gYygiQWN0aW5vYmFjdGVyaWEiID0gIiNGRkI3MjQiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkJhY3Rlcm9pZGV0ZXMiID0gIiM2NEM2MkEiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIkZpcm1pY3V0ZXMiID0gIiMwNzJBQzgiLAogICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgIlByb3Rlb2JhY3RlcmlhIiA9ICIjRTkzQjRGIiwKICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICAgICJPdGhlciBwaHlsYSIgPSAiIzgzMkNGRiIpLAogICAgICAgICAgICAgICAgICAgc3VicGxvdF9tYXJnaW4gPSAwLjAxLAogICAgICAgICAgICAgICAgICAgc3VicGxvdF93aWR0aHMgPSBjKDAuOSwgMC4wNyksCiAgICAgICAgICAgICAgICAgICBzaWRlX2NvbG9yX2NvbG9yYmFyX2xlbiA9IDAuMywKICAgICAgICAgICAgICAgICAgIHBsb3RfbWV0aG9kID0gInBsb3RseSIsCiAgICAgICAgICAgICAgICAgICBjdXN0b21faG92ZXJ0ZXh0ID0gaG92ZXJ0ZXh0LAogICAgICAgICAgICAgICAgICAgeGxhYiA9ICI8Yj5TYW1wbGU8L2I+IiwKICAgICAgICAgICAgICAgICAgIHlsYWIgPSAiPGI+TWljcm9iZTwvYj4iLAogICAgICAgICAgICAgICAgICAgY29sb3JiYXJfeHBvcyA9IDEuMDE5LAogICAgICAgICAgICAgICAgICAgY29sb3JiYXJfeXBvcyA9IDAuNSwKICAgICAgICAgICAgICAgICAgIGNvbG9yYmFyX2xlbiA9IDAuMykgJT4lCiAgbGF5b3V0KHhheGlzID0gbGlzdChzaG93Z3JpZCA9IEZBTFNFKSwKICAgICAgICAgeWF4aXMgPSBsaXN0KHNob3dncmlkID0gRkFMU0UsCiAgICAgICAgICAgICAgICAgICAgICBzaG93dGlja2xhYmVscyA9IEZBTFNFKSwKICAgICAgICAgZm9udCA9IGxpc3QoZmFtaWx5ID0gIkFyaWFsIikpICU+JQogIGNvbG9yYmFyKHRpdGxlID0gIlJlbGF0aXZlIGFidW5kYW5jZSIsCiAgICAgICAgICAgdGlja3ZhbHMgPSBjKC0xLCAwLCAxKSwKICAgICAgICAgICB0aWNrdGV4dCA9IGMoIjAuMSUiLCAiMSUiLCAiMTAlIikpCgojIEZvcm1hdCByb3cgc2lkZQpwSGVhdCR4JGxheW91dCR4YXhpczIkdGlja3RleHQgPC0gIlBoeWx1bSIKcEhlYXQkeCRsYXlvdXQkeGF4aXMkbGluZWNvbG9yIDwtICIjMDAwMDAwIgpwSGVhdCR4JGxheW91dCR4YXhpczIkbGluZWNvbG9yIDwtICIjMDAwMDAwIgpwSGVhdCR4JGxheW91dCR5YXhpcyRsaW5lY29sb3IgPC0gIiMwMDAwMDAiCnBIZWF0JHgkbGF5b3V0JGxlZ2VuZCR5YW5jaG9yIDwtICJib3R0b20iCnBIZWF0CmBgYAoqKkZpZ3VyZSAyOioqIEhlYXQgbWFwIHNob3dpbmcgcmVsYXRpdmUgYWJ1bmRhbmNlIG9mIG1pY3JvYmVzIGluIGVhY2ggc2FtcGxlIChOID0gMjkyIHRvdGFsIGlkZW50aWZpZWQpLiBFYWNoIHJvdyBjb3JyZXNwb25kcyB0byBhIHVuaXF1ZSBtaWNyb2JlIGFuZCBlYWNoIGNvbHVtbiBjb3JyZXNwb25kcyB0byBhbiBpbmRpdmlkdWFsIHNhbXBsZS4gTm90ZSB0aGUgcmVsYXRpdmUgYWJ1bmRhbmNlIGNvbG9yc2NhbGUgaXMgaW4gbG9nIHVuaXRzLgoKPGJyPjxicj4KCjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+CiMjIyAxLjMgTm90YWJsZSBtaWNyb2JlIGRldGVjdGVkCjwvZGl2PgoKKiAqQWN0aW5vbXljZXMgbmFlc2x1bmRpaSo6CiAgKiBGYWNpbGl0YXRlcyB0aGUgaW5pdGlhbCBjb2xvbml6YXRpb24gb2YgdG9vdGggc3VyZmFjZXMgdmlhIGJpb2ZpbG0gZm9ybWF0aW9uIChEaWdlICpldCBhbCouLCAyMDA5KQogICogRm91bmQgaW4gc2FsaXZhICh+MC45JSByZWxhdGl2ZSBhYnVuZGFuY2UpIGFuZCBhbGwgMyBDYXBTY2FuIHNhbXBsZXMgKDAuMDclIC0gMyUgcmVsYXRpdmUgYWJ1bmRhbmNlKQo8YnI+PGJyPgoKCjxkaXYgY2xhc3M9ImhpZ2hsaWdodCI+CiMjIyAxLjQgUmVmZXJlbmNlcwo8L2Rpdj4KCkRpZ2UsIEkuLCBSYWFydXAsIE0uSy4sIE55ZW5nYWFyZCwgSi5SLiwgS2lsaWFuLCBNLiwgYW5kIE55dmFkLCBCLiAoMjAwOSkgKkFjdGlub215Y2VzIG5hZXNsdW5kaWkqIGluIGluaXRpYWwgZGVudGFsIGJpb2ZpbG0gZm9ybWF0aW9uLiAqTWljcm9iaW9sb2d5KiAqKjE1NToqKiAyMTE24oCTMjEyNi4=